<?php

/**
 * Twoir CMS系统 twCMS
 *
 * (c) cighsen02 <xiayu@959602.com>
 *
 * Create at：2024.10.14
 * Update at: 2025.08.27
*/

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;

/**
 * 系统配制主表
*/
class System extends Model
{
    use HasFactory;

    // 缓存时间常量 30天
    const CACHE_TIME = 60 * 60 * 24 * 30;
    // 缓存名称前缀
    const CACHE_NAME = 'system_';

    protected $fillable = ['key', 'value', 'is_cached'];

    /**
     * 时间戳字段自动填充开关 true自动，false关闭
     *
     * @var bool
     */
    public $timestamps = false;

    /**
     * 根据 key 获取值，使用缓存
     *
     * @param string $key
     * @return mixed
     */
    public static function getValue(string $key)
    {
        return Cache::remember(self::CACHE_NAME . $key, self::CACHE_TIME, fn() => self::where('key', $key)->value('value'));
    }

    /**
     * 设置或更新值
     *
     * @param string $key
     * @param mixed $value
     * @return self
     */
    public static function setValue(string $key, $value): self
    {
        // 使用 updateOrCreate 方法，如果存在则更新，否则创建新记录
        $system = self::updateOrCreate(['key' => $key], ['value' => $value]);

        // 判断是否需要更新缓存
        if ($system->is_cached) {
            Cache::put(self::CACHE_NAME . $key, $system->value, self::CACHE_TIME);
        }
        else {
            Cache::forget(self::CACHE_NAME . $key);
        }

        return $system;
    }

    /**
     * 获取系统的所有参数值（带缓存）
     *
     * @param bool $forceCache
     * @return array
     */
    public static function getAllWithCache(bool $forceCache = false): array
    {
        $cacheKey = self::CACHE_NAME . 'all';

        // 如果需要强制刷新缓存，则先清除缓存
        if ($forceCache) Cache::forget($cacheKey);

        return Cache::remember($cacheKey, static::CACHE_TIME, function() {

            // 获取主表 system 的数据
            $systems = static::where('is_cached', true)
                ->pluck('value', 'key')
                ->toArray();

            // 获取副表 system_adds 的数据
            $systemAdds = SystemAdd::where('is_cached', true)
                ->pluck('value', 'key')
                ->toArray();

            return [...$systems, ...$systemAdds];
        });
    }

    /**
     * 获取所有参数
     *
     * @return array
     */
    public static function getAllWithoutCache(): array
    {
        // 获取主表 system 所有数据
        $systems = static::pluck('value', 'key')->toArray();

        // 获取副表 system_adds 所有数据
        $systemAdds = SystemAdd::pluck('value', 'key')->toArray();

        return [...$systems, ...$systemAdds];
    }
}
